跳到主要内容

任务调度-QuartZ使用示例

注:文章部分内容来自于这篇博客

Nuget选择

在.NET 8 WEB API框架下,可以使用Quartz.Extensions.Hosting

代码示例

Program.cs

#region QuartZ相关
builder.Services.AddQuartz(q =>
{
q.SchedulerId = "Scheduler-Core";
q.SchedulerName = "Quartz ASP.NET Core Sample Scheduler";
q.UseSimpleTypeLoader();
q.UseInMemoryStore();
q.UseDefaultThreadPool(tp =>
{
tp.MaxConcurrency = 10;
});
});
builder.Services.AddQuartzHostedService(q => q.WaitForJobsToComplete = true);
#endregion

任务定义及视图模型

public class MyJob : IJob
{
public Task Execute(IJobExecutionContext context)
{
// 获取上下文中的动态参数
var data = context.JobDetail.JobDataMap.GetString("data");
if (!string.IsNullOrEmpty(data))
{
Console.WriteLine($"Data={data}");
}
Console.WriteLine($"Job Done at {DateTime.Now}");
return Task.CompletedTask;
}
}
public class JobDto
{
public string JobName { get; set; } = string.Empty;
public string JobCron { get; set; } = string.Empty;
public string JobData { get; set; } = string.Empty;
}

通过WEB API Controller动态处理/设定任务

/// <summary>
/// 定时任务控制器-仅测试使用
/// </summary>
[ApiController]
[Route("[controller]")]
//[EnableCors("ACAO")]
public class JobsController : Controller
{
private readonly ISchedulerFactory _scheduleFactory;

public JobsController(ISchedulerFactory schedulerFactory)
{
_scheduleFactory = schedulerFactory;
}

/// <summary>
/// 任务创建
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
//[HttpPost(SwaggerDocVer.V1)]
[HttpPost]
[Authorize]
[AllowAnonymous]
public async Task<IActionResult> ScheduleJob(JobDto dto)
{
// 创建 JobDetail
var job = JobBuilder.Create<MyJob>()
.WithIdentity(dto.JobName) // 指定任务名称
.UsingJobData("data", dto.JobData) // 传递参数
.Build();

//// 创建 Trigger
//var trigger = TriggerBuilder.Create()
// .WithIdentity($"{dto.JobName}_trigger")
// .StartNow()
// .WithCronSchedule(dto.JobCron)// 根据表达式循环执行
// .Build();

// 执行时间为下一分钟的0秒,如当前是0:34:45,则执行时间为0:35:00
var datetimeoffset = DateTimeOffset.Now.AddMinutes(1);
datetimeoffset = new DateTimeOffset(datetimeoffset.Year, datetimeoffset.Month, datetimeoffset.Day, datetimeoffset.Hour, datetimeoffset.Minute, 0, datetimeoffset.Offset);
// 创建 Trigger
var trigger = TriggerBuilder.Create()
.WithIdentity($"{dto.JobName}_trigger")
.StartAt(datetimeoffset) // 只执行一次,执行后结束
.Build();

// 调度任务
var scheduler = await _scheduleFactory.GetScheduler();
await scheduler.ScheduleJob(job, trigger);

return Ok("Job scheduled successfully.");
}

/// <summary>
/// 任务暂停
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
//[HttpPost(SwaggerDocVer.V1 + "/PauseJob")]
[HttpPost("/PauseJob")]
[Authorize]
[AllowAnonymous]
public async Task<IActionResult> PauseJob(JobDto dto)
{
var scheduler = await _scheduleFactory.GetScheduler();
await scheduler.PauseJob(new JobKey(dto.JobName));
return Ok("Job Pause");
}
/// <summary>
/// 任务恢复
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
//[HttpPost(SwaggerDocVer.V1 + "/ResumeJob")]
[HttpPost("/ResumeJob")]
[Authorize]
[AllowAnonymous]
public async Task<IActionResult> ResumeJob(JobDto dto)
{
var scheduler = await _scheduleFactory.GetScheduler();
await scheduler.ResumeJob(new JobKey(dto.JobName));
return Ok("Job Resume");
}
/// <summary>
/// 任务删除
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
//[HttpDelete(SwaggerDocVer.V1)]
[HttpDelete]
[Authorize]
[AllowAnonymous]
public async Task<IActionResult> DeleteJob(JobDto dto)
{
var scheduler = await _scheduleFactory.GetScheduler();
await scheduler.DeleteJob(new JobKey(dto.JobName));
return Ok("Job Delete");
}
/// <summary>
/// 查看当前的所有任务
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
//[HttpGet(SwaggerDocVer.V1)]
[HttpGet]
[Authorize]
[AllowAnonymous]
public async Task<IActionResult> Get()
{
var scheduler = await _scheduleFactory.GetScheduler();
var jobKeys = await scheduler.GetJobKeys(GroupMatcher<JobKey>.AnyGroup());
StringBuilder outPutStr = new StringBuilder();
outPutStr.AppendLine("--------------------------------------");
outPutStr.AppendLine("---------查看当前的所有任务-----------");
foreach (var jobKey in jobKeys)
{
outPutStr.AppendLine($"group:{jobKey.Group},name:{jobKey.Name}");
}
outPutStr.AppendLine("--------------------------------------");
return Ok(outPutStr.ToString());
}
}